home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-05-26 | 74.0 KB | 2,500 lines |
- *- CONPROCS.PRG
- *- (c) Microsoft Corporation 1995
- *
- * This is a procedure file of common file and GENSCRN
- * manipulation routines. Routines were taken from
- * GENSCRN and GENSCRNX programs, with additional routines added.
-
- #INCLUDE convert.h
-
- #DEFINE c_maxwinds 25
- #DEFINE c_maxpops 25
- #DEFINE c_maxscreens 5
-
- *!*****************************************************************************
- *! Function: memofind
- *!*****************************************************************************
- FUNCTION memofind
- * ( borrowed and modified from GENSCRNX - wordsearch )
- * ( with permission from Ken Levy )
- * Parameters:
- * find_str = expression to search for <expC>
- * searchfld = memo field to seach in <expC>
- * ignoreword = use exact match? <expL>
- * returnmline = return line number? <expL>
- * occurance = occurance to effect <expN>
- * allafter = return everything <expL>
- * lNoStrip = don't strip out leading whitespace <expL>
-
- * Returns:
- * returnmline (.F.) ->> char expression following directive
- * returnmline (.T.) ->> line number of expression (was _MLINE)
-
- PARAMETERS find_str,searchfld,ignoreword,returnmline,occurance,allafter,lNoStrip
-
- PRIVATE memodata,memline,memline2,str_data,lastmline
- PRIVATE matchcount,linecount,linecount2,at_mline,at_mline2,mline2
- PRIVATE lf_pos,lf_pos2,at_pos
-
- LOCAL m.memodata2
-
- IF TYPE('m.returnmline')=='N'
- m.returnmline=.T.
- ENDIF
-
- IF TYPE("m.allafter") # "L"
- m.allafter = .F.
- ENDIF
-
- DO CASE
- CASE TYPE('m.occurance')#'N'
- m.occurance=1
- CASE m.occurance<0
- RETURN IIF(m.returnmline,0,C_NULL)
- ENDCASE
-
- * check if memo is empty
- m.memodata=EVALUATE(m.searchfld)
- IF EMPTY(m.searchfld) OR EMPTY(m.memodata) OR m.memodata==C_NULL
- RETURN IIF(m.returnmline,0,C_NULL)
- ENDIF
-
- * initialize vars
- m.memline2=''
- m.lastmline=_MLINE
- m.at_mline=0
- m.at_mline2=0
- m.mline2=0
- m.lf_pos=0
- m.lf_pos2=0
- m.matchcount=0
- m.linecount=0
- m.linecount2=0
-
- *- be brutal -- strip out all indents and line feeds
- IF !lNoStrip
- memodata = CleanWhite(m.memodata)
- ENDIF
-
- *-SUSPEND
- m.memodata=C_CR+m.memodata
- _MLINE=ATC(C_CR+m.find_str,m.memodata)
- IF _MLINE=0
- _MLINE=m.lastmline
- RETURN IIF(m.returnmline,0,C_NULL)
- ENDIF
-
- m.memodata2 = m.memodata && remember it in its pristine form
-
- DO WHILE .T.
- DO CASE
- CASE m.occurance>0 AND _MLINE>=LEN(m.memodata)
- EXIT
- CASE _MLINE>=LEN(m.memodata)
- m.occurance=-1
- OTHERWISE
- m.at_mline=_MLINE
- m.memline=ALLTRIM(MLINE(m.memodata,1,_MLINE))
- m.lf_pos=AT(C_LF,SUBSTR(m.memodata,m.at_mline+1,LEN(m.memline)))
- IF m.lf_pos>0
- m.memline=ALLTRIM(LEFT(m.memline,m.lf_pos-1))
- ENDIF
-
- IF LEN(m.memline) < LEN(m.find_str)+1
- m.str_data = ""
- ELSE
- m.str_data=SUBSTR(m.memline,LEN(m.find_str)+1,1)
- ENDIF
-
- m.at_pos=ATC(m.find_str,m.memline)
- IF m.at_pos#1 OR (!m.ignoreword AND !EMPTY(m.str_data))
- m.at_pos=0
- m.memodata=C_LF+SUBSTR(m.memodata,_MLINE)
- _MLINE=ATC(C_LF+m.find_str,m.memodata)
- IF _MLINE>0
- LOOP
- ENDIF
- m.memodata=C_CR+SUBSTR(m.memodata,2)
- _MLINE=ATC(C_CR+m.find_str,m.memodata)
- IF _MLINE>0
- LOOP
- ENDIF
- IF m.occurance>0
- EXIT
- ENDIF
- ENDIF
- m.matchcount=m.matchcount+1
- IF m.matchcount<m.occurance OR m.occurance=0
- IF m.at_pos=1 AND (m.ignoreword OR EMPTY(m.str_data))
- m.mline2=_MLINE
- m.at_mline2=m.at_mline
- m.memline2=m.memline
- m.lf_pos2=m.lf_pos
- m.linecount2=m.linecount
- ENDIF
- IF BETWEEN(_MLINE,1,LEN(m.memodata))
- _MLINE=_MLINE-2
- m.linecount=m.linecount+_MLINE
- LOOP
- ENDIF
- ENDIF
- ENDCASE
- IF m.occurance<=0
- IF m.mline2=0
- RETURN IIF(m.returnmline,0,C_NULL)
- ENDIF
- _MLINE=m.mline2
- m.at_mline=m.at_mline2
- m.memline=m.memline2
- m.lf_pos=m.lf_pos2
- m.linecount=m.linecount2
- m.occurance=1
- ENDIF
- m.mline2=_MLINE
- _MLINE=m.lastmline
- m.at_pos=0
- m.str_data=SUBSTR(m.memline,LEN(m.find_str)+1)
- IF m.ignoreword AND !LEFT(m.str_data,1)==' ' ;
- AND !m.allafter
- m.at_pos=AT(' ',m.str_data)
- IF m.at_pos>0
- m.str_data=SUBSTR(m.str_data,m.at_pos+1)
- ENDIF
- ENDIF
- m.str_data=ALLTRIM(m.str_data)
- IF !m.returnmline
- RETURN m.str_data
- ENDIF
- m.returnmline=m.mline2-m.at_mline+1-IIF(m.lf_pos>0,1,0)
- *-RETURN m.at_mline+m.linecount
- RETURN OCCURS(C_CR,LEFT(m.memodata2,m.at_mline+m.linecount))
- ENDDO
-
- _MLINE=m.lastmline
- RETURN IIF(m.returnmline,0,C_NULL)
-
- * END
-
- *!*****************************************************************************
- *! Function: memostuff
- *!*****************************************************************************
- FUNCTION memostuff
- * ( borrowed and modified from GENSCRNX - wordstuff )
- * ( with permission from Ken Levy )
- * Parameters:
- * stuff_str = expression to search for <expC>
- * searchfld = memo field to seach in <expC>
- * replace_str = expr to replace with <exprC>
- * insflag = directive line added/removed <expL>
- * insbefore = insert at beginning of snippet <expL>
- * occurance = occurance to effect <expN>
-
- * Returns:
- * .T. if successful
-
- PARAMETERS stuff_str,searchfld,replace_str,insflag,insbefore,occurance
-
- PRIVATE var_type,memodata,memline,snptname
- PRIVATE at_pos,lf_pos,str_len,remove_str,sub_str
-
- LOCAL cTmp, nLine
-
- IF TYPE('m.insflag')=='N'
- m.insflag=(m.insflag=1)
- ENDIF
-
- m.sub_str = IIF(TYPE('m.replace_str')='C',m.replace_str,m.stuff_str)
-
- m.memodata=EVALUATE(m.searchfld)
- m.stuff_str=ALLTRIM(m.stuff_str)
-
- * Remove excess CRLF from top of snippet
- DO WHILE LEFT(m.memodata,1)==C_CR OR LEFT(m.memodata,1)==C_LF
- m.memodata=SUBSTR(m.memodata,2)
- ENDDO
- REPLACE (m.searchfld) WITH m.memodata
-
- m.remove_str=m.stuff_str
- m.at_pos=AT(' ',m.remove_str)
- IF m.at_pos>0
- m.remove_str=ALLTRIM(LEFT(m.remove_str,m.at_pos-1))
- ENDIF
- m.str_len=0
-
- *- memofind now returns the LINE NUMBER, not the _MLINE position. So calculate
- * _MLINE from the line number
- nLine = memofind(m.remove_str,m.searchfld,.T.,.T.,m.occurance) - 1
- cTmp = MLINE(m.memodata,m.nLine)
- m.at_pos = _MLINE + IIF(SUBS(memodata,_MLINE,2) = C_CRLF,2,1)
- cTmp = MLINE(m.memodata,m.nLine + 1)
- str_len = _MLINE - m.at_pos + 1
- *-m.at_pos=memofind(m.remove_str,m.searchfld,.T.,@m.str_len,m.occurance)
- IF m.at_pos=0 OR m.str_len=0
- m.at_pos=0
- ENDIF
-
- IF m.at_pos>0
- m.memline=SUBSTR(m.memodata,m.at_pos,m.str_len)
- m.lf_pos=AT(C_LF,m.memline)
- IF m.lf_pos>0
- m.str_len=m.lf_pos
- ENDIF
- m.memodata=LEFT(m.memodata,m.at_pos-1)+SUBSTR(m.memodata,m.at_pos+m.str_len)
- ENDIF
-
- IF !m.insflag
- IF m.at_pos=0
- RETURN .F.
- ENDIF
- IF UPPER(LEFT(m.searchfld,2))=='M.'
- &searchfld=m.memodata
- ELSE
- REPLACE (m.searchfld) WITH m.memodata
- ENDIF
- RETURN .T.
- ENDIF
-
- DO CASE
- CASE m.at_pos>0
- m.stuff_str=LEFT(m.memodata,m.at_pos-1)+m.sub_str+C_CR+;
- SUBSTR(m.memodata,m.at_pos)
- CASE m.insbefore
- IF !EMPTY(m.memodata)
- m.memodata=C_CR+m.memodata
- ENDIF
- m.stuff_str=m.sub_str+m.memodata
- OTHERWISE
- IF !EMPTY(m.memodata) AND !RIGHT(m.memodata,1)==C_CRLF AND ;
- !RIGHT(m.memodata,1)==C_LF
- m.memodata=m.memodata+C_CR
- ENDIF
- DO WHILE RIGHT(m.memodata,1)==C_CR OR RIGHT(m.memodata,1)==C_LF
- m.memodata=LEFT(m.memodata,LEN(m.memodata)-1)
- ENDDO
- m.stuff_str=m.memodata+C_CR+m.sub_str+C_CR
- ENDCASE
- DO WHILE RIGHT(m.stuff_str,1)==C_CR OR RIGHT(m.stuff_str,1)==C_LF
- m.stuff_str=LEFT(m.stuff_str,LEN(m.stuff_str)-1)
- ENDDO
- m.stuff_str=m.stuff_str+C_CR
- IF UPPER(LEFT(m.searchfld,2))=='M.'
- &searchfld=m.stuff_str
- ELSE
- REPLACE (m.searchfld) WITH m.stuff_str
- ENDIF
- RETURN .T.
-
- * END wordstuff
-
-
- *!*****************************************************************************
- *! Function: GENPROC
- *!*****************************************************************************
- PROCEDURE genproc
-
-
- *PRIVATE ALL LIKE g_*
-
- * g_firstproc holds the line number of the first PROCEDURE or FUNCTION in
- * the cleanup snippet of each screen.
- DIMENSION g_firstproc[C_MAXSCREENS]
- g_firstproc = 0
-
- DIMENSION g_platlist[C_MAXPLATFORMS]
- g_platlist[1] = c_dos
- g_platlist[2] = c_windows
- g_platlist[3] = c_mac
- g_platlist[4] = c_unix
-
- DIMENSION g_procs[1,C_MAXPLATFORMS+3]
- * First column is a procedure name
- * Second through n-th column is the line number in the cleanup snippet where
- * a procedure with this name starts.
- * C_MAXPLATFORMS+2 column is a 1 if this procedure has been emitted.
- * C_MAXPLATFORMS+3 column holds the parameter statement, if any.
- * One row for each unique procedure name found in the cleanup snippet for any platform.
- g_procs = -1
- g_procs[1,1] = ""
- g_procs[1,C_MAXPLATFORMS+3] = ""
- g_procnames = 0 && the number we've found so far
- g_tabchr = ""
-
- SCAN FOR objtype = 1 AND isgenplat(platform)
- DO updprocarray
- ENDSCAN
-
- SCAN FOR objtype = 1 AND isgenplat(platform)
- IF EMPTY(proccode)
- LOOP
- ENDIF
- DO extractprocs WITH 1
- ENDSCAN
-
- RETURN
-
- *!*****************************************************************************
- *! Function: GETFIRSTLINE
- *!*****************************************************************************
- FUNCTION getfirstline
- *)
- *) Find first line # in snippet for:
- *) 1. PROCEDURE or FUNCTION statement in a cleanup
- *) 2. PARAMETER statement
- *) 3. SECTION1/2
- PARAMETER m.snipname,m.sniptype,m.sectnum
- PRIVATE proclineno, numlines, word1
- _MLINE = 0
- m.numlines = MEMLINES(&snipname)
- FOR m.proclineno = 1 TO m.numlines
- m.line = MLINE(&snipname, 1, _MLINE)
- DO killcr WITH m.line
- m.line = UPPER(LTRIM(STRTRAN(m.line,C_TAB,' ')))
- m.word1 = wordnum(m.line,1)
- DO CASE
- CASE m.sniptype = "PARM"
- IF !EMPTY(m.word1) AND match(m.word1,"PARAMETERS")
- RETURN m.proclineno
- ENDIF
- CASE m.sniptype = "SECT"
- IF !EMPTY(m.word1) AND LEFT(m.line,5) = "#SECT" ;
- AND AT(m.sectnum,m.line) # 0
- RETURN m.proclineno
- ENDIF
- CASE m.sniptype = "PROC"
- IF !EMPTY(m.word1) AND (match(m.word1,"PROCEDURE") OR match(m.word1,"FUNCTION"))
- RETURN m.proclineno
- ENDIF
- ENDCASE
- ENDFOR
- RETURN 0
-
-
- *!*****************************************************************************
- *! Function: wordnum
- *!*****************************************************************************
- FUNCTION wordnum
- *)
- *) WORDNUM - Returns w_num-th word from string strg
- *)
- PARAMETERS m.strg,m.w_num
- PRIVATE strg,s1,w_num,ret_str
-
- m.s1 = ALLTRIM(m.strg)
-
- * Replace tabs with spaces
- m.s1 = CHRTRANC(m.s1,CHR(9)," ")
-
- * Reduce multiple spaces to a single space
- DO WHILE AT(' ',m.s1) > 0
- m.s1 = STRTRAN(m.s1,' ',' ')
- ENDDO
-
- ret_str = ""
- DO CASE
- CASE m.w_num > 1
- DO CASE
- CASE AT(" ",m.s1,m.w_num-1) = 0 && No word w_num. Past end of string.
- m.ret_str = ""
- CASE AT(" ",m.s1,m.w_num) = 0 && Word w_num is last word in string.
- m.ret_str = SUBSTR(m.s1,AT(" ",m.s1,m.w_num-1)+1,255)
- OTHERWISE && Word w_num is in the middle.
- m.strt_pos = AT(" ",m.s1,m.w_num-1)
- m.ret_str = SUBSTR(m.s1,strt_pos,AT(" ",m.s1,m.w_num)+1 - strt_pos)
- ENDCASE
- CASE m.w_num = 1
- IF AT(" ",m.s1) > 0 && Get first word.
- m.ret_str = SUBSTR(m.s1,1,AT(" ",m.s1)-1)
- ELSE && There is only one word. Get it.
- m.ret_str = m.s1
- ENDIF
- ENDCASE
- RETURN ALLTRIM(m.ret_str)
-
- *!*****************************************************************************
- *! PROCEDURE: KILLCR
- *!*****************************************************************************
- PROCEDURE killcr
- PARAMETER m.strg
- IF _MAC
- m.strg = CHRTRANC(m.strg,CHR(13)+CHR(10),"")
- ENDIF
- RETURN
-
- *!*****************************************************************************
- *! Function: MATCH
- *!*****************************************************************************
- FUNCTION match
- *)
- *) MATCH - Returns TRUE if candidate is a valid 4-or-more-character abbreviation of keyword
- *)
- PARAMETER m.candidate, m.keyword
- PRIVATE m.in_exact, m.retlog
-
- m.in_exact = SET("EXACT")
- SET EXACT OFF
- DO CASE
- CASE EMPTY(m.candidate)
- m.retlog = EMPTY(m.keyword)
- CASE LEN(m.candidate) < 4
- m.retlog = IIF(m.candidate == m.keyword,.T.,.F.)
- OTHERWISE
- m.retlog = IIF(m.keyword = m.candidate,.T.,.F.)
- ENDCASE
- IF m.in_exact != "OFF"
- SET EXACT ON
- ENDIF
-
- RETURN m.retlog
-
- *!*****************************************************************************
- *!
- *! Function: GETPARAM
- *!
- *! Called by: CHECKPARAM() (function in GENSCRN.PRG)
- *!
- *! Calls: ISCOMMENT() (function in GENSCRN.PRG)
- *! : WORDNUM() (function in GENSCRN.PRG)
- *! : MATCH() (function in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- FUNCTION getparam
- *)
- *) GETPARAM - Return the PARAMETER statement from a setup snippet, if one is there
- *)
- PARAMETER m.snipname
- PRIVATE m.i, m.thisparam, m.numlines, m.thisline, m.word1, m.contin
-
- m.g_dblampersand = CHR(38) + CHR(38) && used in some tight loops. Concatenate just once here.
-
- * Do a quick check to see if we need to search further.
- IF ATC("PARA",&snipname) = 0
- RETURN ""
- ENDIF
-
- m.numlines = MEMLINES(&snipname)
- _MLINE = 0
- m.i = 1
- DO WHILE m.i <= m.numlines
- m.thisline = UPPER(LTRIM(MLINE(&snipname, 1, _MLINE)))
- DO killcr WITH m.thisline
-
- * Drop any double-ampersand comment
- IF AT(m.g_dblampersand,m.thisline) > 0
- m.thisline = LEFT(m.thisline,AT(m.g_dblampersand,m.thisline)-1)
- ENDIF
-
- IF !EMPTY(m.thisline) AND !iscomment(@thisline)
- * See if the first non-blank, non-comment, non-directive, non-EXTERNAL
- * line is a #SECTION 1
- DO CASE
- CASE LEFT(m.thisline,5) = "#SECT" AND AT('1',m.thisline) <> 0
- * Read until we find a #SECTION 2, the end of the snippet or a
- * PARAMETER statement.
- DO WHILE m.i <= m.numlines
- m.thisline = UPPER(LTRIM(MLINE(&snipname, 1, _MLINE)))
- DO killcr WITH m.thisline
-
- * Drop any double-ampersand comment
- IF AT(m.g_dblampersand,m.thisline) > 0
- m.thisline = LEFT(m.thisline,AT(m.g_dblampersand,m.thisline)-1)
- ENDIF
-
- m.word1 = wordnum(CHRTRANC(m.thisline,CHR(9)+';',' '),1)
- DO CASE
- CASE match(m.word1,"PARAMETERS")
-
- * Replace tabs with spaces
- m.thisline = LTRIM(CHRTRANC(m.thisline,CHR(9)," "))
-
- * Process continuation lines. Replace tabs in incoming lines with spaces.
- DO WHILE RIGHT(RTRIM(m.thisline),1) = ';'
- m.thisline = m.thisline + ' '+ CHR(13)+CHR(10)+CHR(9)
- m.contin = MLINE(&snipname, 1, _MLINE)
- DO killcr WITH m.contin
- m.contin = CHRTRANC(LTRIM(m.contin),CHR(9)," ")
- m.thisline = m.thisline + UPPER(m.contin)
- ENDDO
-
- * Clean up the parameters so that minor differences in
- * spacing don't cause the comparisons to fail.
-
- * Take the parameters but not the PARAMETER keyword itself
- m.thisparam = SUBSTR(m.thisline,AT(' ',m.thisline)+1)
- DO WHILE INLIST(LEFT(m.thisparam,1),CHR(10),CHR(13),CHR(9),' ')
- m.thisparam = SUBSTR(m.thisparam,2)
- ENDDO
-
- * Force single spacing in the param string
- DO WHILE AT(' ',m.thisparam) > 0
- m.thisparam = STRTRAN(m.thisparam,' ',' ')
- ENDDO
-
- * Drop "m." designations so that they don't make the variables look different
- m.thisparam = STRTRAN(m.thisparam,'m.','')
- m.thisparam = STRTRAN(m.thisparam,'M.','')
- m.thisparam = STRTRAN(m.thisparam,'m->','')
- m.thisparam = STRTRAN(m.thisparam,'M->','')
-
- RETURN LOWER(m.thisparam)
- CASE LEFT(m.thisline,5) = "#SECT" AND AT('2',m.thisline) <> 0
- * No parameter statement, since we found #SECTION 2 first
- RETURN ""
- ENDCASE
- m.i = m.i + 1
- ENDDO
- CASE LEFT(m.thisline,1) = "#" && some other directive
- * Do nothing. Get next line.
- CASE match(wordnum(m.thisline,1),"EXTERNAL")
- * Ignore it. This doesn't disqualify a later statement from being a PARAMETER
- * statement.
- OTHERWISE
- * no #SECTION 1, so no parameters
- RETURN ""
- ENDCASE
- ENDIF
- m.i = m.i + 1
- ENDDO
- RETURN ""
-
-
- *!*****************************************************************************
- *!
- *! Function: ISCOMMENT
- *!
- *! Called by: WRITECODE (procedure in GENSCRN.PRG)
- *! : WRITELINE (procedure in GENSCRN.PRG)
- *! : ADDTOCTRL (procedure in GENSCRN.PRG)
- *! : GETPARAM() (function in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- FUNCTION iscomment
- *)
- *) ISCOMMENT - Determine if textline is a comment line.
- *)
- PARAMETER m.textline
- PRIVATE m.asterisk, m.isnote, m.ampersand, m.statement
- IF EMPTY(m.textline)
- RETURN .F.
- ENDIF
- m.statement = UPPER(LTRIM(m.textline))
-
- m.asterisk = AT("*", m.statement)
- m.ampersand = AT(m.g_dblampersand, m.statement)
- m.isnote = AT("NOTE", m.statement)
-
- DO CASE
- CASE (m.asterisk = 1 OR m.ampersand = 1)
- RETURN .T.
- CASE (m.isnote = 1 ;
- AND (LEN(m.statement) <= 4 OR SUBSTR(m.statement,5,1) = ' '))
- * Don't be fooled by something like "notebook = 7"
- RETURN .T.
- ENDCASE
- RETURN .F.
-
- *!*****************************************************************************
- *!
- *! Function: ISPARAMETER
- *!
- *! Called by: WRITECODE (procedure in GENSCRN.PRG)
- *!
- *! Calls: MATCH() (function in GENSCRN.PRG)
- *! : WORDNUM() (function in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- FUNCTION isparameter
- *)
- *) ISPARAMETER - Determine if strg is a PARAMETERS statement
- *)
- PARAMETER m.strg
- PRIVATE m.ispar
- m.ispar = .F.
- IF !EMPTY(strg) AND match(CHRTRANC(wordnum(strg,1),';',''),"PARAMETERS")
- m.ispar = .T.
- ENDIF
- RETURN m.ispar
-
-
- *!*****************************************************************************
- *!
- *! Function: PROCSMATCH
- *!
- *!*****************************************************************************
- FUNCTION procsmatch
- *)
- *) PROCSMATCH - Are the CRCs for the cleanup snippets the same for all platforms in the
- *) current screen that are being generated?
- *)
- PRIVATE m.crccode, m.thiscode, m.in_rec
-
- m.in_rec = IIF(!EOF(),RECNO(),1)
- m.crccode = "0"
- * Get the headers for all the platforms we are generating
- SCAN FOR objtype = 1 AND isgenplat(platform)
- m.thiscode = ALLTRIM(SYS(2007,proccode))
- DO CASE
- CASE m.crccode = "0"
- m.crccode = m.thiscode
- CASE m.thiscode <> m.crccode AND m.crccode <> "0"
- RETURN .F.
- ENDCASE
- ENDSCAN
- GOTO m.in_rec
- RETURN .T.
-
- *!*****************************************************************************
- *!
- *! Function: ISGENPLAT
- *!
- *! Called by: GENPROCEDURES (procedure in GENSCRN.PRG)
- *! : PROCSMATCH() (function in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- FUNCTION isgenplat
- *)
- *) ISGENPLAT - Is this platform one of the ones being generated?
- *)
- PARAMETER m.platname
- RETURN IIF(ASCAN(g_platforms,ALLTRIM(UPPER(m.platname))) > 0, .T. , .F. )
-
-
-
- *!*****************************************************************************
- *!
- *! Function: CLEANPARAM
- *!
- *!*****************************************************************************
- FUNCTION cleanparam
- *)
- *) CLEANPARAM - Clean up a parameter string so that it may be compared with another one.
- *) This function replaces tabs with spaces, capitalizes the string, merges
- *) forces single spacing, and strips out CR/LF characters.
- *)
- PARAMETER m.p, m.cp
- m.cp = UPPER(ALLTRIM(CHRTRANC(m.p,";"+CHR(13)+CHR(10),""))) && drop CR/LF and continuation chars
- m.cp = CHRTRANC(m.cp,CHR(9),' ') && tabs to spaces
- DO WHILE AT(' ',m.cp) > 0 && reduce multiple spaces to a single space
- m.cp = STRTRAN(m.cp,' ',' ')
- ENDDO
- DO WHILE AT(', ',m.cp) > 0 && drop spaces after commas
- m.cp = STRTRAN(m.cp,', ',',')
- ENDDO
- RETURN m.cp
-
- *!*****************************************************************************
- *!
- *! Procedure: ADDPROCNAME
- *!
- *! Called by: UPDPROCARRAY (procedure in GENSCRN.PRG)
- *!
- *! Calls: GETPLATNUM() (function in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- PROCEDURE addprocname
- *)
- *) ADDPROCNAME - Update g_procs with pname data
- *)
- PARAMETER m.pname, m.platname, m.linenum, m.lastmline
- PRIVATE m.rnum, m.platformcol, m.i, m.j
- IF EMPTY(m.pname)
- RETURN
- ENDIF
-
- * Look up this name in the procedures array
- m.rnum = 0
- FOR m.i = 1 TO m.g_procnames
- IF g_procs[m.i,1] == m.pname
- m.rnum = m.i
- EXIT
- ENDIF
- ENDFOR
-
- IF m.rnum = 0
- * New name
- g_procnames = m.g_procnames + 1
- DIMENSION g_procs[m.g_procnames,C_MAXPLATFORMS+3]
- g_procs[m.g_procnames,1] = UPPER(ALLTRIM(m.pname))
- FOR m.j = 1 TO c_maxplatforms
- g_procs[m.g_procnames,m.j + 1] = -1
- ENDFOR
- g_procs[m.g_procnames,C_MAXPLATFORMS+2] = .F. && not emitted yet
- g_procs[m.g_procnames,C_MAXPLATFORMS+3] = "" && parameter statement
- m.rnum = m.g_procnames
- ENDIF
-
- m.platformcol = getplatnum(m.platname) + 1
- IF m.platformcol > 1
- g_procs[m.rnum, m.platformcol] = m.lastmline
- ENDIF
- RETURN
-
- *!*****************************************************************************
- *!
- *! Function: GETPLATNUM
- *!
- *! Called by: PREPWNAMES (procedure in GENSCRN.PRG)
- *! : ADDPROCNAME (procedure in GENSCRN.PRG)
- *! : WRITECODE (procedure in GENSCRN.PRG)
- *! : WRITELINE (procedure in GENSCRN.PRG)
- *! : ADDTOCTRL (procedure in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- FUNCTION getplatnum
- *)
- *) GETPLATNUM - Return the g_platlist array index given a platform name
- *)
- PARAMETER m.platname
- PRIVATE m.i
- FOR m.i = 1 TO c_maxplatforms
- IF g_platlist[m.i] == UPPER(ALLTRIM(m.platname))
- RETURN m.i
- ENDIF
- ENDFOR
- RETURN 0
-
-
-
- *!*****************************************************************************
- *!
- *! Procedure: EXTRACTPROCS
- *!
- *!*****************************************************************************
- PROCEDURE extractprocs
- *)
- *) EXTRACTPROCS - Output the procedures for the current platform in the current screen
- *)
- * We only get here if we are emitting for multiple platforms and the cleanup snippets
- * for all platforms are not identical. We are positioned on a screen header record for
- * the g_genvers platform.
-
- *- NOTE: Also called if multiple procs in a VALID or other snippet
- *- If passed, snipname is memo field to go through. Otherwise, set to "proccode"
-
- PARAMETER m.scrnno, m.snipname
-
- PRIVATE m.hascontin, m.iscontin, m.sniplen, m.i, m.thisline, m.pnum, m.word1, m.word2
-
- IF PARAMETERS() = 1
- m.snipname = "proccode"
- ENDIF
-
- _MLINE = 0
- m.sniplen = LEN(&snipname)
- m.numlines = MEMLINES(&snipname)
- m.hascontin = .F.
- DO WHILE _MLINE < m.sniplen
- m.thisline = UPPER(ALLTRIM(MLINE(&snipname,1, _MLINE)))
- DO killcr WITH m.thisline
- m.iscontin = m.hascontin
- m.hascontin = RIGHT(m.thisline,1) = ';'
- IF LEFT(m.thisline,1) $ "PF" AND !m.iscontin
- m.word1 = wordnum(m.thisline, 1)
- IF match(m.word1,"PROCEDURE") OR match(m.word1,"FUNCTION")
- m.word2 = wordnum(m.thisline,2)
- * Does this procedure have a name conflict?
- IF PARAMETERS() = 1
- m.pnum = getprocnum(m.word2)
- IF pnum > 0
- DO CASE
- CASE g_procs[m.pnum,C_MAXPLATFORMS+2]
- * This one has already been generated. Skip past it now.
- DO emitproc WITH .F., m.thisline, m.sniplen, m.scrnno, m.snipname
- LOOP
- CASE hasconflict(m.pnum)
- * Name collision detected. Output bracketed code for all platforms
- DO emitbracket WITH m.pnum, m.scrnno
- OTHERWISE
- * This procedure has no name collision and has not been emitted yet.
- DO emitproc WITH .T., m.thisline, m.sniplen, m.scrnno, m.snipname
- ENDCASE
- g_procs[pnum,C_MAXPLATFORMS+2] = .T.
- ENDIF && pnum > 0
- ELSE
- *- special case, called for VALID or WHEN
- *- Welcome to Kludge City
- g_tabchr = ""
- DIMENSION g_platforms[1]
- STORE "" TO g_platforms
- DIMENSION g_platlist[C_MAXPLATFORMS]
- g_platlist[1] = c_dos
- g_platlist[2] = c_windows
- g_platlist[3] = c_mac
- g_platlist[4] = c_unix
- DO emitproc WITH .T., m.thisline, m.sniplen, m.scrnno, m.snipname
- ENDIF && PARAMETERS() = 1
- ENDIF
- ENDIF
- ENDDO
- RETURN
-
- *!*****************************************************************************
- *!
- *! Procedure: EMITPROC
- *!
- *! Called by: EXTRACTPROCS (procedure in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- PROCEDURE emitproc
- *)
- *) EMITPROC - Scan through the next procedure/function in the current cleanup snippet.
- *) If dowrite is TRUE, emit the code as we go. Otherwise, just skip over it
- *) and advance _MLINE.
- *)
- * We are positioned on the PROCEDURE or FUNCTION line now and there isn't a name
- * conflict.
- PARAMETER m.dowrite, m.thisline, m.sniplen, m.scrnno, m.snipname
- PRIVATE m.word1, m.word2, m.line, m.upline, m.done, m.lastmline, ;
- m.iscontin, m.hascontin, m.platnum
-
- m.hascontin = .F.
- m.done = .F.
-
- * Write the PROCEDURE/FUNCTION statement
- m.upline = UPPER(ALLTRIM(CHRTRANC(m.thisline,chr(9),' ')))
-
- m.g_genvers = g_platforms[1]
-
- m.platnum = getplatnum(m.g_genvers)
-
- IF m.dowrite && actually emit the procedure?
- DO writeline WITH m.thisline, m.g_genvers, m.platnum, m.upline, m.scrnno
- ENDIF
-
- * Write the body of the procedure
- DO WHILE !m.done AND _MLINE < m.sniplen
- m.lastmline = _MLINE && note where this line started
-
- m.line = MLINE(&snipname,1, _MLINE)
- DO killcr WITH m.line
- m.upline = UPPER(ALLTRIM(CHRTRANC(m.line,chr(9),' ')))
-
- m.iscontin = m.hascontin
- m.hascontin = RIGHT(m.upline,1) = ';'
- IF LEFT(m.upline,1) $ "PF" AND !m.iscontin
- m.word1 = wordnum(m.upline, 1)
- IF match(m.word1,"PROCEDURE") OR match(m.word1,"FUNCTION")
- done = .T.
- _MLINE = m.lastmline && drop back one line and stop writing
- LOOP
- ENDIF
- ENDIF
-
- IF m.dowrite && actually emit the procedure?
- DO writeline WITH m.line, m.g_genvers, m.platnum, m.upline, m.scrnno
- ENDIF
-
- ENDDO
- RETURN && emitproc
-
- *!*****************************************************************************
- *!
- *! Procedure: EMITBRACKET
- *!
- *! Called by: EXTRACTPROCS (procedure in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- PROCEDURE emitbracket
- *)
- *) EMITBRACKET - Emit DO CASE/CASE _DOS brackets and call putproc to emit code for this procedure
- *)
- PARAMETER m.pnum, m.scrnno
- PRIVATE m.word1, m.word2, m.line, m.upline, m.done, m.lastmline, ;
- m.iscontin, m.hascontin, m.i
- m.hascontin = .F.
- m.done = .F.
-
- REPLACE _FOX3SPR.SPRMEMO WITH C_CRLF +;
- "PROCEDURE "+g_procs[m.pnum,1]+ C_CRLF ADDITIVE
-
- IF !EMPTY(g_procs[m.pnum,C_MAXPLATFORMS+3])
-
- REPLACE _FOX3SPR.SPRMEMO WITH ;
- "PARAMETERS "+g_procs[m.pnum,C_MAXPLATFORMS+3]+ C_CRLF ADDITIVE
-
- ENDIF
-
- REPLACE _FOX3SPR.SPRMEMO WITH "DO CASE" + C_CRLF ADDITIVE
-
- * Peek ahead and get the parameter statement
- FOR m.platnum = 1 TO c_maxplatforms
- IF g_procs[m.pnum,m.platnum+1] < 0
- * There was no procedure for this platform
- LOOP
- ENDIF
-
- REPLACE _FOX3SPR.SPRMEMO WITH "CASE "+"_"+g_platlist[m.platnum]+ C_CRLF ADDITIVE
- m.g_tabchr=C_TAB
- DO putproc WITH m.platnum, m.pnum, m.scrnno
- m.g_tabchr=""
- ENDFOR
-
- REPLACE _FOX3SPR.SPRMEMO WITH "ENDCASE" + C_CRLF ADDITIVE
-
- RETURN
-
- *!*****************************************************************************
- *!
- *! Procedure: PUTPROC
- *!
- *! Called by: EMITBRACKET (procedure in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- PROCEDURE putproc
- *)
- *) PUTPROC - Write actual code for procedure procnum in platform platnum
- *)
- PARAMETER m.platnum, m.procnum, m.scrnno
- PRIVATE m.in_rec, m.oldmine, m.done, m.line, m.upline, m.iscontin, m.hascontin, ;
- m.word1, m.word2, m.platnum
-
- m.in_rec = RECNO()
- * Store the _MLINE position in the original snippet
- m.oldmline = _MLINE
- m.hascontin = .F. && the previous line was not a continuation line.
- LOCATE FOR platform = g_platlist[m.platnum] AND objtype = 1
- IF FOUND()
- * go to the PROCEDURE/FUNCTION statement
- _MLINE = g_procs[m.procnum,m.platnum+1]
- * Skip the PROCEDURE line, since we've already output one.
- m.line = MLINE(proccode,1, _MLINE)
- DO killcr WITH m.line
-
- * We are now positioned at the line following the procedure statement.
- * Write until the end of the snippet or the next procedure.
- m.done = .F.
- DO WHILE !m.done
- m.line = MLINE(proccode,1, _MLINE)
- DO killcr WITH m.line
- m.upline = UPPER(ALLTRIM(CHRTRANC(m.line,chr(9),' ')))
- m.iscontin = m.hascontin
- m.hascontin = RIGHT(m.upline,1) = ';'
- IF LEFT(m.upline,1) $ "PF" AND !m.iscontin
- m.word1 = wordnum(m.upline, 1)
- IF RIGHT(m.word1,1) = ';'
- m.word1 = LEFT(m.word1,LEN(m.word1)-1)
- ENDIF
-
- DO CASE
- CASE match(m.word1,"PROCEDURE") OR match(m.word1,"FUNCTION")
- * Stop when we encounter the next snippet
- m.done = .T.
- LOOP
- CASE match(m.word1,"PARAMETERS")
- * Don't output it, but keep scanning for other code
- DO WHILE m.hascontin
- m.line = MLINE(proccode,1, _MLINE)
- DO killcr WITH m.line
- m.upline = UPPER(ALLTRIM(CHRTRANC(m.line,chr(9),' ')))
- m.hascontin = RIGHT(m.upline,1) = ';'
- ENDDO
- LOOP
- ENDCASE
- ENDIF
-
- DO writeline WITH m.line, g_platlist[m.platnum], m.platnum, m.upline, m.scrnno
-
- * Stop if we've run out of snippet
- IF _MLINE >= LEN(proccode)
- m.done = .T.
- ENDIF
- ENDDO
- ENDIF
-
- GOTO m.in_rec
- * Restore the _MLINE position in the main snippet we are outputing
- _MLINE = m.oldmline
- RETURN
-
-
-
- *!*****************************************************************************
- *!
- *! Procedure: UPDPROCARRAY
- *!
- *!*****************************************************************************
- PROCEDURE updprocarray
- *)
- *) UPDPROCARRAY - Pick out the procedures names in the current cleanup snippet and call
- *) AddProcName to update the g_procs array.
- *)
- PRIVATE m.i, m.numlines, m.line, m.upline, m.word1, m.word2, m.iscontin, m.hascontin, ;
- m.lastmline, m.thisproc
-
- _MLINE = 0
- m.numlines = MEMLINES(proccode)
- m.hascontin = .F.
- FOR m.i = 1 TO m.numlines
- m.lastmline = _MLINE && note starting position of this line
- m.line = MLINE(proccode,1, _MLINE)
- DO killcr WITH m.line
- m.upline = UPPER(ALLTRIM(m.line))
- m.iscontin = m.hascontin
- m.hascontin = RIGHT(m.upline,1) = ';'
- IF LEFT(m.upline,1) $ "PF" AND !m.iscontin
- m.word1 = CHRTRANC(wordnum(m.upline, 1),';','')
- DO CASE
- CASE match(m.word1,"PROCEDURE") OR match(m.word1,"FUNCTION")
- m.word2 = wordnum(m.upline,2)
- DO addprocname WITH m.word2, platform, m.i, m.lastmline
- m.lastproc = m.word2
- CASE match(m.word1,"PARAMETERS")
- * Associate this parameter statement with the last procedure or function
- m.thisproc = getprocnum(m.lastproc)
- IF m.thisproc > 0
- m.thisparam = ALLTRIM(SUBSTR(m.upline,AT(' ',m.upline)+1))
- * Deal with continued PARAMETER lines
- DO WHILE m.hascontin AND m.i <= m.numlines
- m.lastmline = _MLINE && note the starting position of this line
- m.line = MLINE(proccode,1, _MLINE)
- DO killcr WITH m.line
- m.upline = UPPER(ALLTRIM(CHRTRANC(m.line,chr(9),' ')))
- m.thisparam = ;
- m.thisparam + CHR(13)+CHR(10) + m.line
- m.hascontin = RIGHT(m.upline,1) = ';'
- m.i = m.i + 1
- ENDDO
- * Make sure that this parameter matches any others we've seen for this function
- DO CASE
- CASE EMPTY(g_procs[m.thisproc,C_MAXPLATFORMS+3])
- * First occurrence, or one platform has a parameter statement and another doesn't
- g_procs[m.thisproc,C_MAXPLATFORMS+3] = m.thisparam
- CASE cleanparam(m.thisparam) = cleanparam(g_procs[m.thisproc,C_MAXPLATFORMS+3])
- * The new one is a superset of the existing one. Use the longer one.
- g_procs[m.thisproc,C_MAXPLATFORMS+3] = m.thisparam
- ENDCASE
- ENDIF
- ENDCASE
- ENDIF
- ENDFOR
- RETURN
-
-
-
- *!*****************************************************************************
- *!
- *! Function: GETPROCNUM
- *!
- *! Called by: EXTRACTPROCS (procedure in GENSCRN.PRG)
- *! : UPDPROCARRAY (procedure in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- FUNCTION getprocnum
- *)
- *) GETPROCNUM - Return the g_procs array position of the procedure named pname
- *)
- PARAMETER m.pname
- PRIVATE m.i
- FOR m.i = 1 TO g_procnames
- IF g_procs[m.i,1] == m.pname
- RETURN m.i
- ENDIF
- ENDFOR
- RETURN 0
-
-
- *!*****************************************************************************
- *!
- *! Function: CLEANPARAM
- *!
- *!*****************************************************************************
- FUNCTION cleanparam
- *)
- *) CLEANPARAM - Clean up a parameter string so that it may be compared with another one.
- *) This function replaces tabs with spaces, capitalizes the string, merges
- *) forces single spacing, and strips out CR/LF characters.
- *)
- PARAMETER m.p, m.cp
- m.cp = UPPER(ALLTRIM(CHRTRANC(m.p,";"+CHR(13)+CHR(10),""))) && drop CR/LF and continuation chars
- m.cp = CHRTRANC(m.cp,CHR(9),' ') && tabs to spaces
- DO WHILE AT(' ',m.cp) > 0 && reduce multiple spaces to a single space
- m.cp = STRTRAN(m.cp,' ',' ')
- ENDDO
- DO WHILE AT(', ',m.cp) > 0 && drop spaces after commas
- m.cp = STRTRAN(m.cp,', ',',')
- ENDDO
- RETURN m.cp
-
- *!*****************************************************************************
- *!
- *! Procedure: WRITELINE
- *!
- *! Called by: EMITPROC (procedure in GENSCRN.PRG)
- *! : PUTPROC (procedure in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- PROCEDURE writeline
- *)
- *) WRITELINE - Emit a single line
- *)
- PARAMETER m.line, m.platname, m.platnum, m.upline, m.scrnno
- PRIVATE m.at, m.expr
-
- * This code relies upon partial matching (e.g., "*! Comment" will equal "*")
- DO CASE
- CASE m.upline = "*"
- IF !(m.upline = "*!" OR m.upline = "*:")
- REPLACE _FOX3SPR.SPRMEMO WITH m.g_tabchr + m.line+ C_CRLF ADDITIVE
- ENDIF
- CASE m.upline = "#"
- * don't output a generator directive, but #DEFINES are OK
- IF LEFT(m.upline,5) = "#DEFI" ;
- OR LEFT(m.upline,3) = "#IF" ;
- OR LEFT(m.upline,5) = "#ELSE" ;
- OR LEFT(m.upline,6) = "#ENDIF"
- REPLACE _FOX3SPR.SPRMEMO WITH m.g_tabchr + m.line+ C_CRLF ADDITIVE
- ENDIF
- OTHERWISE
- REPLACE _FOX3SPR.SPRMEMO WITH m.g_tabchr + m.line+ C_CRLF ADDITIVE
- ENDCASE
- RETURN
-
-
- *!*****************************************************************************
- *!
- *! Function: HASCONFLICT
- *!
- *! Called by: EXTRACTPROCS (procedure in GENSCRN.PRG)
- *!
- *!*****************************************************************************
- FUNCTION hasconflict
- *)
- *) HASCONFLICT - Is there a name collision for procedure number num?
- *)
- PARAMETER m.num
- PRIVATE m.i, m.cnt
- m.cnt = 0
- FOR m.i = 1 TO c_maxplatforms
- IF g_procs[m.num,m.i+1] > 0
- m.cnt = m.cnt +1
- ENDIF
- ENDFOR
- RETURN IIF(m.cnt > 1,.T.,.F.)
-
- *!*****************************************************************************
- *!
- *! Procedure: GETARRANGE
- *!
- *!*****************************************************************************
- PROCEDURE getarrange
- PARAMETER m.astring,m.curplat,m.arrange_flag, m.center_flag, m.row, m.col, m.lscxcenter
- PRIVATE m.j, m.pname, m.entries
- IF !EMPTY(m.astring)
- m.entries = INT(LEN(m.astring)/26)
- m.center_flag = m.lscxcenter
- FOR m.j = 1 TO m.entries
- m.pname = ALLTRIM(UPPER(SUBSTR(m.astring,(m.j-1)*26+1,8)))
- m.pname = ALLTRIM(CHRTRANC(m.pname,CHR(0)," "))
- IF m.pname == m.curplat && found the right one-platform
- IF INLIST(UPPER(SUBSTR(m.astring,(m.j-1)*26 + 9,1)),'Y','T') && is it arranged?
- m.arrange_flag = .T.
- IF INLIST(UPPER(SUBSTR(m.astring,(m.j-1)*26 + 10,1)),'Y','T') && is it centered?
- m.center_flag = .T.
- ELSE
- m.center_flag = .F.
- m.row = VAL(SUBSTR(m.astring,(m.j-1)*26 + 11,8))
- m.col = VAL(SUBSTR(m.astring,(m.j-1)*26 + 19,8))
- ENDIF
- ENDIF
- EXIT
- ENDIF
- NEXT
- ENDIF
-
- RETURN
-
- ******************************************************************************
- ******************************************************************************
- * Misc Generic File Utility Routines
- ******************************************************************************
- ******************************************************************************
-
- *!*****************************************************************************
- *! Function: STRIPEXT
- *!*****************************************************************************
- FUNCTION stripext
- *)
- *) STRIPEXT - Strip the extension from a file name.
- *)
- *) Description:
- *) Use the algorithm employed by FoxPRO itself to strip a
- *) file of an extension (if any): Find the rightmost dot in
- *) the filename. If this dot occurs to the right of a "\"
- *) or ":", then treat everything from the dot rightward
- *) as an extension. Of course, if we found no dot,
- *) we just hand back the filename unchanged.
- *)
- *) Parameters:
- *) filename - character string representing a file name
- *)
- *) Return value:
- *) The string "filename" with any extension removed
- *)
- PARAMETER m.filename
- PRIVATE m.dotpos, m.terminator
- m.dotpos = RAT(".", m.filename)
- m.terminator = MAX(RAT("\", m.filename), RAT(":", m.filename))
- IF m.dotpos > m.terminator
- m.filename = LEFT(m.filename, m.dotpos-1)
- ENDIF
- RETURN m.filename
-
- *!*****************************************************************************
- *! Function: STRIPPATH
- *!*****************************************************************************
- FUNCTION strippath
- *)
- *) STRIPPATH - Strip the path from a file name.
- *)
- *) Description:
- *) Find positions of backslash in the name of the file. If there is one
- *) take everything to the right of its position and make it the new file
- *) name. If there is no slash look for colon. Again if found, take
- *) everything to the right of it as the new name. If neither slash
- *) nor colon are found then return the name unchanged.
- *)
- *) Parameters:
- *) filename - character string representing a file name
- *)
- *) Return value:
- *) The string "filename" with any path removed
- *)
- PARAMETER m.filename
- PRIVATE m.slashpos, m.namelen, m.colonpos
- m.slashpos = RAT("\", m.filename)
- IF m.slashpos > 0
- m.namelen = LEN(m.filename) - m.slashpos
- m.filename = RIGHT(m.filename, m.namelen)
- ELSE
- m.colonpos = RAT(":", m.filename)
- IF m.colonpos > 0
- m.namelen = LEN(m.filename) - m.colonpos
- m.filename = RIGHT(m.filename, m.namelen)
- ENDIF
- ENDIF
- RETURN m.filename
-
- *!*****************************************************************************
- *! Function: STRIPCR
- *!*****************************************************************************
- FUNCTION stripcr
- *)
- *) STRIPCR - Strip off terminating carriage returns and line feeds
- *)
- PARAMETER m.strg
- * Don't use a CHRTRANC since it's remotely possible that the CR or LF might
- * be in a user's quoted string.
- strg = ALLTRIM(strg)
- i = LEN(strg)
- DO WHILE i >= 0 AND INLIST(SUBSTR(strg,i,1),CHR(13),CHR(10))
- i = i - 1
- ENDDO
- RETURN LEFT(strg,i)
-
- *!*****************************************************************************
- *! Function: ADDBS
- *!*****************************************************************************
- FUNCTION addbs
- *)
- *) ADDBS - Add a backslash unless there is one already there.
- *)
- PARAMETER m.pathname
- PRIVATE m.separator
- m.separator = IIF(_MAC,":","\")
- m.pathname = ALLTRIM(UPPER(m.pathname))
- IF !(RIGHT(m.pathname,1) $ '\:') AND !EMPTY(m.pathname)
- m.pathname = m.pathname + m.separator
- ENDIF
- RETURN m.pathname
-
- *!*****************************************************************************
- *! Function: JUSTFNAME
- *!*****************************************************************************
- FUNCTION justfname
- *)
- *) JUSTFNAME - Return just the filename (i.e., no path) from "filname"
- *)
- PARAMETERS m.filname
-
- *- use platform specific path (10/28/95 jd)
- LOCAL clocalfname, cdirsep
-
- cdirsep = IIF(_mac,':','\')
- IF !_mac AND ':' $ filname
- *- maybe we have a funny filename with extra ":", because of futzing with Mac paths (jd 7/17/96)
- clocalfname = SUBSTR(m.filname,AT(":",m.filname,OCCURS(":",m.filname)) + 1)
- ELSE
- clocalfname = m.filname
- ENDIF
-
- clocalfname = SYS(2027,m.clocalfname )
- IF RAT(m.cdirsep ,m.clocalfname) > 0
- m.clocalfname = SUBSTR(m.clocalfname,RAT(m.cdirsep,m.clocalfname)+1,255)
- ENDIF
- IF AT(':',m.clocalfname) > 0
- m.clocalfname = SUBSTR(m.clocalfname,AT(':',m.clocalfname)+1,255)
- ENDIF
- RETURN ALLTRIM(m.clocalfname)
-
- *!*****************************************************************************
- *! Function: JUSTSTEM
- *!*****************************************************************************
- FUNCTION juststem
- * Return just the stem name from "filname"
- PARAMETERS m.filname
- *- use platform specific path (10/28/95 jd)
- LOCAL clocalfname, cdirsep
- clocalfname = SYS(2027,m.filname)
- cdirsep = IIF(_mac,':','\')
- IF RAT(m.cdirsep ,m.clocalfname) > 0
- m.clocalfname = SUBSTR(m.clocalfname,RAT(m.cdirsep,m.clocalfname)+1,255)
- ENDIF
- IF AT(':',m.clocalfname) > 0
- m.clocalfname = SUBSTR(m.clocalfname,AT(':',m.clocalfname)+1,255)
- ENDIF
- IF AT('.',m.clocalfname) > 0
- m.clocalfname = SUBSTR(m.clocalfname,1,AT('.',m.clocalfname)-1)
- ENDIF
- RETURN ALLTRIM(UPPER(m.clocalfname))
-
- *!*****************************************************************************
- *! Function: JUSTPATH
- *!*****************************************************************************
- FUNCTION justpath
- *)
- *) JUSTPATH - Returns just the pathname.
- *)
- PARAMETERS m.filname
- m.filname = ALLTRIM(UPPER(m.filname))
- *- use platform specific path (10/28/95 jd)
- LOCAL clocalfname, cdirsep
- clocalfname = SYS(2027,m.filname)
- cdirsep = IIF(_mac,':','\')
- IF m.cdirsep $ m.clocalfname
- m.clocalfname = SUBSTR(m.clocalfname,1,RAT(m.cdirsep,m.clocalfname ))
- IF RIGHT(m.filname,1) = m.cdirsep AND LEN(m.filname) > 1 ;
- AND SUBSTR(m.clocalfname,LEN(m.clocalfname)-1,1) <> ':'
- clocalfname= SUBSTR(m.clocalfname,1,LEN(m.clocalfname)-1)
- ENDIF
- RETURN m.clocalfname
- ELSE
- RETURN ''
- ENDIF
-
- *!*****************************************************************************
- *! Function: JUSTEXT
- *!*****************************************************************************
- FUNCTION justext
- * Return just the extension from "filname"
- PARAMETERS m.filname
- PRIVATE m.ext
- filname = justfname(m.filname) && prevents problems with ..\ paths
- m.ext = ""
- IF AT('.',m.filname) > 0
- m.ext = SUBSTR(m.filname,AT('.',m.filname)+1,3)
- ENDIF
- RETURN UPPER(m.ext)
-
- *!*****************************************************************************
- *! Function: JustDrive
- *!*****************************************************************************
- FUNCTION JustDrive
- *- Return just the drive from "filname"
- PARAMETERS m.filname
- RETURN LEFT(m.filname,IIF(":" $ m.filname,AT(":",m.filname) - 1,""))
-
- *!*****************************************************************************
- *! Procedure: PARTIALFNAME
- *!*****************************************************************************
- FUNCTION partialfname
- PARAMETER m.filname, m.fillen
- * Return a filname no longer than m.fillen characters. Take some chars
- * out of the middle if necessary. No matter what m.fillen is, this function
- * always returns at least the file stem and extension.
- PRIVATE m.bname, m.elipse, m.remain,m.g_pathsep
- IF _MAC
- m.g_pathsep = ":"
- ELSE
- m.g_pathsep = "\"
- ENDIF
-
- m.elipse = "..." + m.g_pathsep
- IF _MAC
- m.bname = SUBSTR(m.filname, RAT(":",m.filname)+1)
- ELSE
- m.bname = justfname(m.filname)
- ENDIF
- DO CASE
- CASE LEN(m.filname) <= m.fillen
- m.retstr = m.filname
- CASE LEN(m.bname) + LEN(m.elipse) >= m.fillen
- m.retstr = m.bname
- OTHERWISE
- m.remain = MAX(m.fillen - LEN(m.bname) - LEN(m.elipse), 0)
- IF _MAC
- m.retstr = LEFT(SUBSTR(m.filname,1,RAT(":",m.filname)-1),m.remain) ;
- +m.elipse+m.bname
- ELSE
- m.retstr = LEFT(justpath(m.filname),m.remain)+m.elipse+m.bname
- ENDIF
- ENDCASE
- RETURN m.retstr
-
- *!*****************************************************************************
- *! Function: FORCEEXT
- *!*****************************************************************************
- FUNCTION forceext
- *)
- *) FORCEEXT - Force filename to have a particular extension.
- *)
- PARAMETERS m.filname,m.ext
- PRIVATE m.ext
- IF SUBSTR(m.ext,1,1) = "."
- m.ext = SUBSTR(m.ext,2,3)
- ENDIF
-
- m.pname = justpath(m.filname)
- m.filname = justfname(UPPER(ALLTRIM(m.filname)))
- IF AT('.',m.filname) > 0
- m.filname = SUBSTR(m.filname,1,AT('.',m.filname)-1) + '.' + m.ext
- ELSE
- m.filname = m.filname + '.' + m.ext
- ENDIF
- RETURN addbs(m.pname) + m.filname
-
- ********************
- procedure CPCodes
- ********************
- * This procedure initializes a two-column array containing code pages
- * and their corresponding DBF Byte identifier.
-
- parameters m.wzaCPCodes
-
- dimension wzaCPCodes[20,2]
-
- wzaCPCodes[ 1,1] = 437 && US MS-DOS
- wzaCPCodes[ 1,2] = 1
- wzaCPCodes[ 2,1] = 850 && International MS-DOS
- wzaCPCodes[ 2,2] = 2
- wzaCPCodes[ 3,1] = 1252 && Windows ANSI
- wzaCPCodes[ 3,2] = 3
- wzaCPCodes[ 4,1] = 10000 && Standard Macintosh
- wzaCPCodes[ 4,2] = 4
- wzaCPCodes[ 5,1] = 852 && Eastern European MS-DOS
- wzaCPCodes[ 5,2] = 100
- wzaCPCodes[ 6,1] = 866 && Russian MS-DOS
- wzaCPCodes[ 6,2] = 101
- wzaCPCodes[ 7,1] = 865 && Nordic MS-DOS
- wzaCPCodes[ 7,2] = 102
- wzaCPCodes[ 8,1] = 861 && Icelandic MS-DOS
- wzaCPCodes[ 8,2] = 103
- wzaCPCodes[ 9,1] = 895 && Kamenicky (Czech) MS-DOS
- wzaCPCodes[ 9,2] = 104
- wzaCPCodes[10,1] = 620 && Mazovia (Polish) MS-DOS
- wzaCPCodes[10,2] = 105
- wzaCPCodes[11,1] = 737 && Greek MS-DOS
- wzaCPCodes[11,2] = 106
- wzaCPCodes[12,1] = 857 && Turkish MS-DOS
- wzaCPCodes[12,2] = 107
- wzaCPCodes[13,1] = 10007 && Russian Macintosh
- wzaCPCodes[13,2] = 150
- wzaCPCodes[14,1] = 10029 && Eastern European Macintosh
- wzaCPCodes[14,2] = 151
- wzaCPCodes[15,1] = 10006 && Greek Macintosh
- wzaCPCodes[15,2] = 152
- wzaCPCodes[16,1] = 1250 && Eastern European Windows
- wzaCPCodes[16,2] = 200
- wzaCPCodes[17,1] = 1251 && Russian Windows
- wzaCPCodes[17,2] = 201
- wzaCPCodes[18,1] = 1253 && Greek Windows
- wzaCPCodes[18,2] = 203
- wzaCPCodes[19,1] = 1254 && Turkish Windows
- wzaCPCodes[19,2] = 202
- wzaCPCodes[20,1] = 0 && Not tagged
- wzaCPCodes[20,2] = 0
-
- ENDPROC
-
- ********************
- procedure CPTag
- ********************
- * This procedure tags the specified table with the specified code page.
- * This procedure is designed to be called after having opened a table and
- * checked the CPDBF() value. It does not verify that the file is a DBF.
-
- parameters m.wzsFName, m.wziCodePage
-
- #DEFINE C_NOFILE 20 && Invalid code page
- #DEFINE C_BADCODEPG 21 && Invalid code page
- #DEFINE C_NOOPEN 22 && File could not be opened
- private m.wziHandle, m.wzaCPCodes, m.wziDBFByte, m.wzi
-
- dimension wzaCPCodes[1]
- do CPCodes with wzaCPCodes
-
- m.wziDBFByte=-1
- for m.wzi=1 to alen(wzaCPCodes,1)
- if m.wziCodePage=wzaCPCodes[m.wzi,1]
- m.wziDBFByte=wzaCPCodes[m.wzi,2]
- exit
- endif
- endfor
- if m.wziDBFByte=-1 && Invalid code page
- =MESSAGEBOX(STRTRAN(E_BADCODEPAGE_LOC,"@1",ALLT(STR(m.wziCodePage)),1))
- return .f.
- else
- if !file(m.wzsFName) && File does not exist
- =MESSAGEBOX(STRTRAN(E_FILENOEXIST_LOC,"@1",m.wzsFName,1))
- return .f.
- else
- m.wziHandle=FOPEN(m.wzsFName,2)
- if !m.wziHandle=-1
- * Poke the codepage id into byte 29
- =fseek(m.wziHandle,29)
- =fwrite(m.wziHandle,chr(m.wziDBFByte))
- =fclose(m.wziHandle)
- else && File could not be opened
- =MESSAGEBOX(E_NOOPEN_LOC + m.wzsFName)
- return .f.
- endif
- endif
- endif
-
- ENDFUNC
-
-
- *------------------------------------
- PROCEDURE EscHand
- *------------------------------------
- RETURN
-
- *------------------------------------
- PROCEDURE Readable
- *------------------------------------
- *- Check to see if the file is readable
-
- PARAMETER cFile
-
- LOCAL m.nFileReady
-
- m.nFileReady = FOPEN(cFile)
- IF m.nFileReady = -1
- RETURN .F.
- ELSE
- =FCLOSE(m.nFileReady)
- RETURN .T.
- ENDIF
-
- ENDPROC
-
-
- *------------------------------------
- PROCEDURE TmpAlias
- *------------------------------------
- * Returns generated name for use as an alias.
- PRIVATE m.wzsAlias
- m.wzsAlias=SYS(2015)
- DO WHILE USED(m.wzsAlias)
- m.wzsAlias=SYS(2015)
- ENDDO
- RETURN m.wzsAlias
-
-
- *------------------------------------
- procedure UpdPaths
- *------------------------------------
- PARAMETERS m.wzsOldName
-
- PRIVATE m.wzsJustPath, m.wzsPath, m.wzsTName
- m.wzsPath=SET('path')
- SET PATH TO
-
- m.wzsJustPath=addbs(upper(justpath(SYS(2027,m.wzsOldName))))
-
- SCAN FOR !UPPER(type)=='FPC'
- IF m.wzsJustPath$SYS(2027,upper(path))
- m.wzsTName=STRTRAN(SYS(2027,upper(path)),m.wzsJustPath,'',1,1)
- IF file(addbs(justpath(SYS(2027,dbf())))+m.wzsTName)
- REPLACE path WITH upper(addbs(justpath(SYS(2027,dbf())))+m.wzsTName)
- LOOP
- ENDIF
- IF JUSTDRIVE(SYS(2027,upper(path)))==JUSTDRIVE(m.wzsJustPath)
- m.wzsTName=STRTRAN(SYS(2027,UPPER(path)),JUSTDRIVE(m.wzsJustPath),'',1,1)
- IF FILE(JUSTDRIVE(SYS(2027,dbf()))+m.wzsTName)
- REPLACE path WITH upper(justdrive(SYS(2027,dbf()))+m.wzsTName)
- ENDIF
- ENDIF
- ENDIF
- ENDSCAN
-
- LOCATE FOR UPPER(type)=='FPC'
- REPLACE path WITH DBF()
-
- SET PATH TO (m.wzsPath)
- RETURN
-
- *------------------------------------
- procedure DBTable
- *------------------------------------
- * This procedure returns .t. if the specified file has a dBASE III or IV
- * memo field that will need to be converted.
-
- parameters m.wzsFName
-
- if !file(m.wzsFName)
- return .f.
- endif
-
- wzsFName = SYS(2027,wzsFName)
-
- private m.wziTypeByte, m.wziHandle
- m.wziHandle=FOPEN(m.wzsFName)
- if m.wziHandle=-1
- =MESSAGEBOX(E_NOOPEN_LOC + m.wzsFName)
- return .f.
- endif
- m.wziTypeByte=asc(fread(m.wziHandle,1))
- if !fclose(m.wziHandle)
- =MESSAGEBOX(E_NOCLOSE_LOC + m.wzsFName)
- endif
-
- * 0x83 (131) FoxBASE+/dBASE III PLUS, with memo
- * 0x8B (139) dBASE IV, with memo
- if m.wziTypeByte=131 .or. m.wziTypeByte=139
- return .t.
- else
- return .f.
- endif
-
- *------------------------------------
- procedure FileExt
- *------------------------------------
- * This procedure returns the FoxPro extension based on the
- * type of file.
- parameters m.wzsType, m.wzsMethod
- do case
- case m.wzsType='TABLE'
- return 'dbf'
- case m.wzsType='QUERY'
- if m.wzsMethod='DESIGN'
- return 'qpr'
- else
- return 'fpq'
- endif
- case m.wzsType='FORM'
- return 'scx'
- case m.wzsType='REPORT'
- return 'frx'
- case m.wzsType='LABEL'
- return 'lbx'
- case m.wzsType='PROGRAM'
- return 'prg'
- case m.wzsType='CATALOG'
- return 'fpc'
- endcase
-
- *----------------------------------
- FUNCTION CvtLine
- *----------------------------------
- *- Convert DOS char-type lines to line objects
- *-
- *- Assume report or screen is open exclusive as DBF, with alias newfile
- *- and is positioned on record with text field
- PARAMETER avline
-
- #DEFINE K_LOWLINE 179
- #DEFINE K_HILINE 218
- #DEFINE K_HORZLN1 CHR(196)
- #DEFINE K_VERTLN1 CHR(179)
-
- #DEFINE K_ULCORN1 CHR(218)
- #DEFINE K_URCORN1 CHR(191)
- #DEFINE K_LLCORN1 CHR(192)
- #DEFINE K_LRCORN1 CHR(217)
-
- #DEFINE K_CROSS1 CHR(197)
- #DEFINE K_LCROSS1 CHR(195)
- #DEFINE K_RCROSS1 CHR(180)
- #DEFINE K_TCROSS1 CHR(194)
- #DEFINE K_BCROSS1 CHR(193)
-
- #DEFINE K_RV1H2 CHR(181) && Right side, single vertical, double horizontal
- #DEFINE K_LV1H2 CHR(198) && Left side, single vertical, double horizontal
- #DEFINE K_CV1H2 CHR(216) && Cross, single vertical, double horizontal
-
- *- mixed single/double
- #DEFINE K_V1H2 CHR(213) + CHR(209) + CHR(184) + CHR(198) + CHR(216) + CHR(181) + CHR(212) + CHR(207) + CHR(190)
- #DEFINE K_V2H1 CHR(214) + CHR(210) + CHR(183) + CHR(199) + CHR(215) + CHR(182) + CHR(211) + CHR(208) + CHR(189)
-
- #DEFINE K_HORZSET1 K_HORZLN1 + K_ULCORN1 + K_URCORN1 + K_LLCORN1 + K_LRCORN1 + K_CROSS1 + K_LCROSS1 + K_RCROSS1 + K_TCROSS1 + K_BCROSS1 + K_V2H1
- #DEFINE K_VERTSET1 K_VERTLN1 + K_ULCORN1 + K_URCORN1 + K_LLCORN1 + K_LRCORN1 + K_CROSS1 + K_LCROSS1 + K_RCROSS1 + K_TCROSS1 + K_BCROSS1 + K_V1H2
- *----------------------------------
- #DEFINE K_HORZLN2 CHR(205)
- #DEFINE K_VERTLN2 CHR(186)
-
- #DEFINE K_ULCORN2 CHR(201)
- #DEFINE K_URCORN2 CHR(187)
- #DEFINE K_LLCORN2 CHR(200)
- #DEFINE K_LRCORN2 CHR(188)
-
- #DEFINE K_CROSS2 CHR(206)
- #DEFINE K_LCROSS2 CHR(204)
- #DEFINE K_RCROSS2 CHR(185)
- #DEFINE K_TCROSS2 CHR(203)
- #DEFINE K_BCROSS2 CHR(202)
-
- #DEFINE K_HORZSET2 K_HORZLN2 + K_ULCORN2 + K_URCORN2 + K_LLCORN2 + K_LRCORN2 + K_CROSS2 + K_LCROSS2 + K_RCROSS2 + K_TCROSS2 + K_BCROSS2 + K_V1H2
- #DEFINE K_VERTSET2 K_VERTLN2 + K_ULCORN2 + K_URCORN2 + K_LLCORN2 + K_LRCORN2 + K_CROSS2 + K_LCROSS2 + K_RCROSS2 + K_TCROSS2 + K_BCROSS2 + K_V2H1
-
- LOCAL lhsingle, lhdouble, lvsingle, lvdouble, nlen, nstartpos, nvpos, nhpos, nctr,;
- ncurrec, ccolorpr
-
- *- see if special chars are in the text field
- m.nlen = LEN(newfile.expr)
- m.nstartpos = -1
- STORE .F. TO m.lhsingle, m.lhdouble
- FOR m.nctr = 2 TO m.nlen
- m.cchar = SUBS(newfile.expr,m.nctr,1)
- m.nascval = ASC(m.cchar)
- IF m.cchar $ K_HORZSET1 OR m.cchar $ K_HORZSET2
- *- horizontal line
- *- see if run of the little buggers
- IF m.nstartpos = -1
- *- remember line characteristics
- IF m.cchar $ K_HORZSET1
- m.lhsingle = .T.
- m.lhdouble = .F.
- ENDIF
- IF m.cchar $ K_HORZSET2
- m.lhsingle = .F.
- m.lhdouble = .T.
- ENDIF
- m.nstartpos = m.nctr
- ENDIF
- ELSE
- IF m.nstartpos <> -1
- *- started a run, and it has ended
- *- remember current coords
- m.nvpos = newfile.vpos
- m.nhpos = newfile.hpos
- IF m.filetype = dbiv_scr_type
- m.ccolorpr = newfile.colorpair
- ENDIF
- m.ncurrec = RECNO()
- *- remove line chars from text field
- IF m.nctr - m.nstartpos - 1 = m.nlen
- *- entire text field is a line, so use this record
- ELSE
- REPLACE newfile.expr WITH LEFT(newfile.expr,m.nstartpos - 1) + ;
- SPACE(m.nctr - m.nstartpos) + ;
- SUBS(newfile.expr,m.nctr)
- *- add record to report/screen
- APPEND BLANK
- ENDIF
- REPLACE newfile.objtype WITH 7,;
- newfile.objcode WITH IIF(m.lhsingle,4,5),;
- newfile.vpos WITH m.nvpos,;
- newfile.hpos WITH m.nhpos + m.nstartpos - 2,;
- newfile.height WITH 1,;
- newfile.width WITH m.nctr - m.nstartpos
- IF m.filetype = dbiv_scr_type
- REPLACE newfile.colorpair WITH m.ccolorpr
- ENDIF
- *- reset start pos
- m.nstartpos = -1
- *- return to the record in question
- GO m.ncurrec
- ENDIF
- ENDIF
- STORE .F. TO m.lvsingle, m.lvdouble
- IF m.cchar $ K_VERTSET1
- m.lvsingle = .T.
- ENDIF
- IF m.cchar $ K_VERTSET2
- m.lvdouble = .T.
- ENDIF
- IF m.lvsingle OR m.lvdouble
- *- vertical line
- IF m.filetype = dbiv_scr_type
- m.ccolorpr = newfile.colorpair
- ENDIF
- m.nhpos = newfile.hpos + m.nctr - 1
- IF avline[m.nhpos,1] = -1
- *- new vertical line
- avline[m.nhpos,1] = newfile.vpos
- avline[m.nhpos,2] = 1
- avline[m.nhpos,4] = m.lvsingle
- IF m.filetype = dbiv_scr_type
- avline[m.nhpos,3] = m.ccolorpr
- ENDIF
- ELSE
- avline[m.nhpos,2] = avline[m.nhpos,2] + 1
- ENDIF
- IF m.nlen = 3
- *- entire text field is a line, so delete this record
- DELETE
- ELSE
- *- replace vertical line with space
- REPLACE newfile.expr WITH LEFT(newfile.expr,m.nctr - 1) + ;
- SPACE(1) + ;
- SUBS(newfile.expr,m.nctr + 1)
- ENDIF
- ELSE
- *- check if vertical line ended
- m.nhpos = newfile.hpos + m.nctr - 1
- IF avline[m.nhpos,1] <> -1
- *- remember current coords
- m.ncurrec = RECNO()
- *- add record
- APPEND BLANK
- REPLACE newfile.objtype WITH 7,;
- newfile.objcode WITH IIF(avline[m.nhpos,4],4,5),;
- newfile.vpos WITH avline[m.nhpos,1],;
- newfile.hpos WITH m.nhpos - 1,;
- newfile.height WITH avline[m.nhpos,2],;
- newfile.width WITH 1
- IF m.filetype = dbiv_scr_type
- REPLACE newfile.colorpair WITH avline[m.nhpos,3]
- ENDIF
- *- return to the record in question
- GO m.ncurrec
- *- reset array
- avline[m.nhpos,1] = -1
- avline[m.nhpos,2] = -1
- avline[m.nhpos,3] = -1
- avline[m.nhpos,4] = -1
- ENDIF && end of vertical line
- ENDIF
- NEXT
- *- trim off unnecessary spaces?
- m.nleadspac = LEN(SUBS(newfile.expr,2)) - LEN(LTRIM(SUBS(newfile.expr,2)))
- IF m.nleadspac > 0
- REPLACE newfile.expr WITH '"' + SUBS(newfile.expr,m.nleadspac + 2),;
- newfile.hpos WITH newfile.hpos + m.nleadspac,;
- newfile.width WITH MAX(LEN(newfile.expr) - 2,0)
- ENDIF
- m.ntrailspac = LEN(newfile.expr) - 1 - LEN(TRIM(LEFT(newfile.expr,LEN(newfile.expr) - 1)))
- IF m.ntrailspac > 0
- REPLACE newfile.expr WITH LEFT(newfile.expr,LEN(newfile.expr) - 1 - m.ntrailspac) + '"',;
- newfile.width WITH MAX(LEN(newfile.expr) - 2,0)
- ENDIF
- *- remove invalid records
- DELETE ALL FOR newfile.objtype = 5 AND newfile.expr = '""'
- RETURN
-
- ENDFUNC
-
- *----------------------------------
- PROCEDURE FixVert
- *----------------------------------
- *- Check for vertical lines that haven't been added to form
- PARAMETER avline
-
- LOCAL m.nctr
-
- FOR m.nctr = 1 TO ALEN(avline,1)
- IF avline[m.nctr,1] <> -1
- *- add record
- APPEND BLANK
- REPLACE newfile.objtype WITH 7,;
- newfile.objcode WITH IIF(avline[m.nctr,4],4,5),;
- newfile.vpos WITH avline[m.nctr,1],;
- newfile.hpos WITH m.nctr,;
- newfile.height WITH avline[m.nctr,2],;
- newfile.width WITH 1,;
- newfile.uniqueid WITH SYS(2015),;
- newfile.platform WITH "DOS"
- IF m.filetype = dbiv_scr_type
- REPLACE newfile.colorpair WITH avline[m.nctr,3]
- ENDIF
- ENDIF
- NEXT
- *- pack to get rid of deleted vertical line records
- PACK
- RETURN
-
- ENDPROC && FixVert
-
- *----------------------------------
- PROCEDURE GoodName
- *----------------------------------
- *- Make a legal alias out of parm.
- PARAMETERS m.wzsAlias
- PRIVATE m.i,m.c,m.retval
- IF '\' $ m.wzsAlias
- m.wzsAlias = JustStem(m.wzsAlias)
- ENDIF
- IF m.wzsAlias # '_' AND !ISALPHA(m.wzsAlias)
- m.wzsAlias = '_' + m.wzsAlias
- ENDIF
- *- reworked code to prevent err if name is longer than 10 (jd 5/6/94)
- m.retval=""
- FOR m.i=1 TO MIN(LEN(m.wzsAlias),10) &&max len of alias
- m.c = SUBSTR(m.wzsAlias,m.i,1)
- IF !ISALPHA(m.c) AND m.c # '_' AND !ISDIGIT(m.c)
- m.retval = m.retval + "_"
- ELSE
- m.retval = m.retval + m.c
- ENDIF
- ENDFOR
- RETURN m.retval
-
- ENDPROC && GoodName
-
- *----------------------------------
- FUNCTION EvalData
- * function no longer used
- *----------------------------------
- PARAMETER m.cData,m.cDataType
- DO CASE
- CASE m.cDataType= 'C'
- RETURN m.cData
- CASE m.cDataType= 'N'
- RETURN VAL(m.cData)
- CASE m.cDataType= 'D'
- RETURN CTOD(m.cData)
- CASE m.cDataType= 'L'
- m.ctempexpr = m.cData
- RETURN EVALUATE(ctempexpr)
- CASE m.cDataType= 'A'
- *- handle arrays differently
- RETURN ''
- OTHERWISE
- *- ???? unknown? undefined??
- RETURN ''
- ENDCASE
- RETURN ''
- ENDFUNC && EvalData
-
- *----------------------------------
- FUNCTION StripQuote
- *----------------------------------
- *- strip off quotes of string
- PARAMETER cString
-
- LOCAL cQuote
-
- cQuote = LEFT(cString,1)
- IF m.cQuote $ ["'] + "]"
- cString = STRTRAN(cString,cQuote,"")
- IF cQuote = "["
- cString = STRTRAN(cString,"]","")
- ENDIF
- ENDIF
- RETURN cString
-
- ENDFUNC && StripQuote
-
- *----------------------------------
- FUNCTION StripParen
- *----------------------------------
- *- strip out any text within parens
- PARAMETER cText, cLParen, cRParen
-
- IF cLParen $ cText AND !(cRParen $ cText)
- *- no matching rparen
- cText = LEFT(cText,AT(cLParen,cText) - 1)
- ENDIF
-
- DO WHILE cLParen $ cText
- cText = LEFT(cText,AT(cLParen,cText) - 1) + ;
- IIF(AT(cRParen,cText) = LEN(cText),"",SUBS(cText,RAT(cRParen,cText) + 1))
- ENDDO
- *- strip out lingering right parens
- m.cText = STRTRAN(m.cText,cRParen,"")
- RETURN m.cText
- ENDFUNC && StripParen
-
- *----------------------------------
- FUNCTION GoodName
- *----------------------------------
- *- convert a string to a valid VFP object name
- PARAMETER cText
-
- LOCAL j
-
- IF !(ISALPHA(SUBS(m.cText,1,1)) OR SUBS(m.cText,1,1) == "_")
- m.cText = STUFF(m.cText,1,1,"_")
- ENDIF
- FOR m.j = 2 TO LEN(m.cText)
- IF !(ISALPHA(SUBS(m.cText,j,1)) OR ;
- ISDIGIT(SUBS(m.cText,j,1)) OR ;
- SUBS(m.cText,j,1) == "_")
- m.cText = STUFF(m.cText,j,1,"_")
- ENDIF
- NEXT
- RETURN m.cText
- ENDFUNC
-
- *----------------------------------
- FUNCTION IsDir
- *----------------------------------
- *- test if a directory exists
- PARAMETER cDir
-
- LOCAL aDirArry, iDirCt
-
- DIMENSION aDirArry[1]
-
- iDirCt = ADIR(aDirArry,AddBS(cDir) + "*.*", "D")
-
- RETURN (m.iDirCt > 0)
-
- ENDFUNC
-
- *----------------------------------
- PROCEDURE EscHandler
- *----------------------------------
-
- IF MESSAGEBOX(C_ESCAPE_LOC,MB_YESNO + 256) = IDYES
- IF TYPE("gOPJX") = 'O'
- *- it's an object
- gOPJX.Error(0)
- ELSE
- *- problem -- escape has been set, but no object (should be impossible)
- CLOSE ALL
- RETURN TO MASTER
- ENDIF
- ENDIF
-
- ENDPROC
-
- *----------------------------------
- PROCEDURE FatalErr
- *----------------------------------
- *- ON ERROR is set to this in the Error Method
- =MESSAGEBOX(E_FATAL_LOC)
- gError = .T.
- RETURN TO MASTER
-
- ENDPROC
-
- ********************
- PROCEDURE autoname
- ********************
- * This procedure generates an automatic name based on a filename.
-
- PARAMETERS m.wzsbasename, m.wzsextension, m.wzlwithmemo
- PRIVATE m.wzi, m.wzspath, m.wzsstem, m.wziwidth
-
- m.wzspath=addbs(justpath(SYS(2027,m.wzsbasename)))
- m.wzsstem=juststem(m.wzsbasename)
- m.wzi=1
- DO WHILE .T.
- DO CASE
- CASE _DOS .OR. _WINDOWS
- m.wziwidth=8-(LEN(ALLTRIM(STR(m.wzi)))+1)
- m.wzsautoname=UPPER(m.wzspath+LEFT(m.wzsstem,m.wziwidth)+'_'+ ;
- ALLTRIM(STR(m.wzi))+'.'+m.wzsextension)
- CASE _MAC
- m.wziwidth=27-(LEN(ALLTRIM(STR(m.wzi)))+1) && max stem for Mac is 27 (27 + .xxx = 31)
- m.wzsautoname=UPPER(m.wzspath+LEFT(m.wzsstem,m.wziwidth)+'_'+ ;
- ALLTRIM(STR(m.wzi))+'.'+m.wzsextension)
- OTHERWISE
- && work needed here for _unix
- RETURN ""
- *-DO errhand WITH LINENO(), 0, wzatext[175], ''
- ENDCASE
- IF FILE(m.wzsautoname)
- m.wzi=m.wzi+1
- ELSE
- DO CASE
- CASE UPPER(m.wzsextension)='SCX'
- IF FILE(forceext(m.wzsautoname,'SCT'))
- m.wzi=m.wzi+1
- ELSE
- EXIT
- ENDIF
- CASE UPPER(m.wzsextension)='FRX'
- IF FILE(forceext(m.wzsautoname,'FRT'))
- m.wzi=m.wzi+1
- ELSE
- EXIT
- ENDIF
- CASE m.wzlwithmemo
- IF FILE(forceext(m.wzsautoname,'FPT'))
- m.wzi=m.wzi+1
- ELSE
- EXIT
- ENDIF
- OTHERWISE
- EXIT
- ENDCASE
- ENDIF
- ENDDO
- RETURN m.wzsautoname
- *: EOP: AUTONAME
-
- ********************
- procedure PutName
- ********************
- parameters m.wzsFType, m.wzsMethod, m.wzlDelFile
- private m.wzsSafety, m.wzsFname, m.wzsPrompt, m.wzsString
-
- m.wzsMethod=iif(empty(m.wzsMethod),'',m.wzsMethod)
-
- m.wzsSafety=set('safety')
- set safety on
-
- do while .t.
- *- don't supply default of "*.ext" if _mac (4/22/94 jd)
- IF _mac
- m.wzsFName=putfile(STRTRAN(C_SAVETO_LOC,"@1",proper(locword(m.wzsFType))), ;
- "", FileExt(m.wzsFType,m.wzsMethod))
- ELSE
- m.wzsFName=putfile(STRTRAN(C_SAVETO_LOC,"@1",proper(locword(m.wzsFType))), ;
- '*.'+FileExt(m.wzsFType,m.wzsMethod), FileExt(m.wzsFType,m.wzsMethod))
- ENDIF
- if empty(m.wzsFName)
- exit && user cancelled putfile()
- endif
- if m.wzlDelFile
- do case
- case m.wzsFType='CATALOG'
- erase (m.wzsFName)
- erase (forceext(m.wzsFName,'FCT'))
- case m.wzsFType='TABLE'
- erase (m.wzsFName)
- erase (forceext(m.wzsFName,'FPT'))
- erase (forceext(m.wzsFName,'CDX'))
- case m.wzsFType='QUERY'
- erase (m.wzsFName)
- case m.wzsFType='FORM'
- erase (m.wzsFName)
- erase (forceext(m.wzsFName,'SCT'))
- case m.wzsFType='REPORT'
- erase (m.wzsFName)
- erase (forceext(m.wzsFName,'FRT'))
- case m.wzsFType='LABEL'
- erase (m.wzsFName)
- erase (forceext(m.wzsFName,'LBT'))
- case m.wzsFType='PROGRAM'
- erase (m.wzsFName)
- endcase
- exit
- endif
- do case
- *- I believe this should be FCT, not FCX as was the case (jd 5/6/94)
- *- also, changed code to "YESNO" code since question is asked (jd 5/12/94)
- case m.wzsFType='CATALOG' .and. file(forceext(m.wzsFName,'FCT'))
- IF (MESSAGEBOX(STRTRAN(C_OVERWRITE_LOC,"@1",forceext(m.wzsFName,'FCT')),4) = K_NO)
- exit
- endif
- case m.wzsFType='TABLE' .and. file(forceext(m.wzsFName,'FPT'))
- IF (MESSAGEBOX(STRTRAN(C_OVERWRITE_LOC,"@1",forceext(m.wzsFName,'FPT')),4) = K_NO)
- exit
- endif
- case m.wzsFType='FORM' .and. file(forceext(m.wzsFName,'SCT'))
- IF (MESSAGEBOX(STRTRAN(C_OVERWRITE_LOC,"@1",forceext(m.wzsFName,'SCT')),4) = K_NO)
- exit
- endif
- case m.wzsFType='REPORT' .and. file(forceext(m.wzsFName,'FRT'))
- IF (MESSAGEBOX(STRTRAN(C_OVERWRITE_LOC,"@1",forceext(m.wzsFName,'FRT')),4) = K_NO)
- exit
- endif
- case m.wzsFType='LABEL' .and. file(forceext(m.wzsFName,'LBT'))
- IF (MESSAGEBOX(STRTRAN(C_OVERWRITE_LOC,"@1",forceext(m.wzsFName,'LBT')),4) = K_NO)
- exit
- endif
- otherwise
- exit
- endcase
- enddo
-
- set safety &wzsSafety
- return m.wzsFName
- *- eop PutName
-
- ********************
- procedure LocWord
- ********************
- * This procedure returns the localized word for the type
- * of file.
- parameters m.wzsType, m.wziVariation
-
- m.wzsType=upper(m.wzsType)
-
- do case
- case empty(m.wziVariation)
- do case
- case m.wzsType='TABLE'
- return C_TABLE_LOC && Table
- case m.wzsType='QUERY'
- return C_QUERY_LOC && Query
- case m.wzsType='FORM'
- return C_FORM_LOC && Screen
- case m.wzsType='REPORT'
- return C_REPORT_LOC && Report
- case m.wzsType='LABEL'
- return C_LABEL_LOC && Label
- case m.wzsType='PROGRAM'
- return C_PROGRAM_LOC && Program
- case m.wzsType='CATALOG'
- return C_CATALOG_LOC && Catalog
- endcase
- case m.wziVariation=1 && "your screen", "your report", etc.
- do case
- case m.wzsType='TABLE'
- return C_TABLE1_LOC && your table
- case m.wzsType='QUERY'
- return C_QUERY1_LOC && your query
- case m.wzsType='FORM'
- return C_FORM1_LOC && your screen
- case m.wzsType='REPORT'
- return C_REPORT1_LOC && your report
- case m.wzsType='LABEL'
- return C_LABEL1_LOC && your label
- case m.wzsType='PROGRAM'
- return C_PROGRAM1_LOC && your program
- endcase
- case m.wziVariation=2 && "The new screen", "The new report", etc.
- do case
- case m.wzsType='FORM'
- return C_FORM2_LOC && The new screen
- case m.wzsType='REPORT'
- return C_REPORT2_LOC && The new report
- case m.wzsType='LABEL'
- return C_LABEL2_LOC && The new label
- endcase
- case m.wziVariation=3 && "Screen Wizard", "Report Wizard", etc.
- do case
- case m.wzsType='TABLE'
- return C_TABLE3_LOC && Table Wizard
- case m.wzsType='QUERY'
- return C_QUERY3_LOC && Query Wizard
- case m.wzsType='FORM'
- return C_FORM3_LOC && Screen Wizard
- case m.wzsType='REPORT'
- return C_REPORT3_LOC && Report Wizard
- case m.wzsType='LABEL'
- return C_LABEL3_LOC && Label Wizard
- case m.wzsType='PROGRAM'
- return C_PROGRAM3_LOC && Application Wizard
- endcase
- endcase
- *- eop locword.prg
-
- *!*****************************************************************************
- *! Function: FORCEDEC
- *!*****************************************************************************
- FUNCTION ForceDec
- *)
- *) FORECDEC - Force a string to a certain number of decimal places
- PARAMETER cString, nDecimals
-
- RETURN STR(VAL(cString),LEN(cString) + nDecimals + 1,nDecimals)
-
- *------------------------------------
- FUNCTION CleanWhite
- *------------------------------------
- *- strip out leading white space
- PARAMETER cText
-
- LOCAL cTmp
-
- cTmp = STRTRAN(TRIM(cText),C_CRLF,C_CR)
- cTmp = STRTRAN(cTmp,C_TAB,' ')
- DO WHILE C_CR + ' ' $ cTmp
- cTmp = STRTRAN(cTmp,C_CR+' ',C_CR)
- ENDDO
- DO WHILE LEFT(cTmp,1) $ C_LF + ' '
- cTmp = SUBS(cTmp,2)
- ENDDO
- RETURN cTmp
-
- ENDFUNC
-
- FUNCTION CHRTRANC(d1,d2,d3)
- RETURN CHRTRAN(m.d1,m.d2,m.d3)
-
- *----------------------------------
- FUNCTION GetArray
- *----------------------------------
- PARAMETER cText, aList
- LOCAL m.iTextLen, m.cchar
-
- m.iTextLen = LEN(m.cText)
- FOR i = 1 TO m.iTextLen
-
- m.cchar = SUBS(m.cText,i,1)
-
- IF !ISALPHA(m.cchar) AND !ISDIGIT(m.cchar)
- LOOP
- ENDIF
-
- nextItem = GetItem(SUBS(m.cText,i))
- IF EMPTY(aList[1])
- aList[1] = nextItem
- ELSE
- DIMENSION aList[ALEN(aList) + 1]
- aList[ALEN(aList)] = nextItem
- ENDIF
-
- i = i + AT(nextItem,SUBS(cText,i)) + LEN(nextItem) - 1
- NEXT
- RETURN
-
- *----------------------------------
- FUNCTION GetItem
- *----------------------------------
- LPARAMETER m.cText
-
- #DEFINE k_quote ['"] + '['
- #DEFINE k_lbracket '['
- #DEFINE k_rbracket ']'
- #DEFINE k_lparen "("
- #DEFINE k_rparen ")"
- #DEFINE k_space ' '
- #DEFINE k_comma ','
- #DEFINE k_tab CHR(9)
- #DEFINE k_semicol ";"
- #DEFINE k_cr CHR(13)
-
- LOCAL m.iLineLoc, m.quote, m.word, m.n1, m.lparenct, m.iTextLen
-
- *- get everything up to next unenclosed rparen or rbracket
- m.iTextLen = LEN(m.cText)
- FOR m.iLineLoc = 1 TO m.iTextLen
-
- m.cchar = SUBS(m.cText,m.iLineLoc,1)
-
- IF ISALPHA(m.cchar) OR ISDIGIT(m.cchar)
- LOOP
- ENDIF
-
- *- treat any sequence of spaces or tabs as 1 word
- IF m.cchar $ k_space + k_tab + k_cr
- FOR m.iLineLoc = m.iLineLoc + 1 TO m.iTextLen
- m.cchar = SUBS(m.cText,m.iLineLoc,1)
- IF !m.cchar $ k_space + k_tab + k_cr
- EXIT
- ENDIF
- NEXT
- ENDIF
-
- *- if lparen, move ahead to matching rparen
- IF m.cchar $ k_lparen + k_lbracket
- =GetRParen(m.cText,@iLineLoc,m.iTextLen)
- EXIT
- ENDIF
-
- NEXT
-
- RETURN LEFT(m.cText,m.iLineLoc)
-
- ENDFUNC
-
- *----------------------------------
- FUNCTION GetRParen
- *----------------------------------
- LPARAMETERS cText,iLineLoc,m.iTextLen
- LOCAL cchar, m.rparen, m.lparenct
- m.cchar = SUBS(cText,iLineLoc,1)
- m.rparen = IIF(m.cchar = k_lparen, k_rparen, k_rbracket)
- m.lparenct = 1
- FOR m.iLineLoc = m.iLineLoc + 1 TO m.iTextLen
- *- treat enquoted stuff as 1 word
- m.cchar = SUBS(m.cText,m.iLineLoc,1)
- IF m.cchar $ k_quote
- m.endquote = IIF(m.cchar = "[","]",m.cchar)
- m.iLineLoc = m.iLineLoc + AT(m.endquote, SUBS(m.cText,iLineLoc + 1)) + 1
- m.cchar = SUBS(m.cText,m.iLineLoc,1)
- ENDIF
- IF m.cchar = m.rparen
- EXIT
- ENDIF
- IF m.cchar $ k_lparen + k_lbracket
- *- found a nested lparen
- =GetRParen(m.cText, @iLineLoc, m.iTextLen) && recursive call!
- ENDIF
- NEXT
- RETURN
- ENDFUNC
-
-
- *----------------------------------
- FUNCTION pReadOnly
- *----------------------------------
- LPARAMETER cFile
-
- LOCAL ARRAY aDirInfo[1]
-
- IF ADIR(aDirInfo,cFile) == 0
- *- file isn;t there, so fail
- RETURN .T.
- ENDIF
-
- RETURN ('R' $ aDirInfo[1,5])
-
- ENDFUNC
-
- *----------------------------------
- FUNCTION UpdateSCX
- *----------------------------------
- PARAMETER cFile, lRecurse
-
- LOCAL ARRAY aFiles[1,5]
- LOCAL i, iALen, cTarget
-
- cTarget = cFile + IIF(RIGHT(cFile,1) == IIF(_mac,':','\'),"*.*","")
- iALen = ADIR(aFiles, cTarget, 'D')
-
- FOR i = 1 TO iALen
-
- IF !(m.lVCX AND JustExt(aFiles[i,1]) == 'VCX') AND ;
- !(m.lSCX AND JustExt(aFiles[i,1]) == 'SCX') AND ;
- !('D' $ aFiles[i,5])
- *- neither an SCX or a VCX, and not a directory
- LOOP
- ENDIF
-
- DO CASE
- CASE 'D' $ aFiles[i,5]
- IF aFiles[i,1] == "." OR aFiles[i,1] == ".."
- LOOP
- ENDIF
- IF m.lRecurse
- *- directory -- recursive call!
- UpdateSCX(AddBS(AddBS(cFile) + aFiles[i,1]), lRecurse)
- ENDIF
- LOOP
-
- CASE 'R' $ aFiles[i,5]
- *- file is read-only
- =MESSAGEBOX(TRIM(aFiles[i,5]) + E_NOCONVERT3_LOC)
-
- CASE 'H' $ aFiles[i,5] OR 'S' $ aFiles[i,5]
- *- file is hidden, or a system file
- =MESSAGEBOX(TRIM(aFiles[i,5]) + E_NOCONVERT4_LOC)
-
- OTHERWISE
- goMaster.aConvParms[4] = AddBS(JustPath(cFile)) + aFiles[i,1]
-
- =ACOPY(goMaster.aConvParms,aParms)
- oConvObject = CREATE(goMaster.scx30ConverterClass, @aParms, .T.)
-
- IF TYPE("oConvObject") # 'O'
- *- object was not created
- goMaster.lHadError = .T.
- gReturnVal = -1
- RETURN
- ENDIF
-
- IF oConvObject.lHadError
- *- error creating converter object:
- *- assume error has already been presented to user
- goMaster.lHadError = .T.
- RELEASE oConvObject
- gReturnVal = -1
- RETURN
- ENDIF
-
- gReturnVal = oConvObject.Converter()
-
- RELEASE oConvObject
- ENDCASE
- NEXT && going through array of files to convert
-
- ENDFUNC && UpdateSCX
-
-
- *- eof